package 剑指offer;


/*
 * Author：江松
 * Date：2023/3/17 16:05
 *
 正则表达式:  .表示任意字符；x*表示前面字符x可以出现任意次
 自己写：分类讨论情况分太多了
 库函数：str.mathes(String pattern)
 */

public class Main35 {
    public boolean match(char[] str, char[] pattern) {
        if(str==null||pattern==null)return false;
        int len1=str.length,len2=pattern.length;
        if(len1==0||len2==0)return false;
        int i=0,j=0;
        char last=' ';//初始化为不可能出现的字符
        while(i<len1&&j<len2){
            if(str[i]==pattern[j]){
                i++;j++;
            }else{
                if(pattern[j]=='.'){
                    i++;j++;
                }else if(pattern[j]=='*'){
                    while(i<len1-1&&pattern[j-1]==str[i]){
                        i++;
                    }
                    last=str[i];
                    j++;
                }else if(j<len2-1&&pattern[j+1]=='*'){
                    j+=2;
                }else if(pattern[j]==last){
                    j++;
                }
            }
        }

        if(i==len1&&j==len2)return true;
        if(j==len2)return false;
        //i结束，j未结束
        char ch=str[i-1];
        while (j<len2){
            if(pattern[j]=='*'){
                j++;
            }else if(j<len2-1&&pattern[j+1]=='*'){
                j+=2;
            }else {
                return false;
            }
        }
        return true;
    }

    public static void main(String[] args) {

    }
}
